Web Design & Development

Visual Studio - the Extended Version

Einsatz und Entwicklung von Extensions in der aktuellen Version von Visual Studio

Dr. Veikko Krypczyk

In Visual Studio können wir mit einer Vielzahl von Sprachen programmieren und aus Vorlagen für die unterschiedlichsten Projekttypen wählen. Wie aber passen wir die Entwicklungsumgebung an unsere speziellen Bedürfnisse an?

Visual Studio liegt aktuell in der Version 2019 vor und dürfte den meisten Lesern dieses Blogs gut vertraut sein. Die integrierte Entwicklungsumgebung (IDE) ist sehr umfangreich und kann für eine Vielzahl von Programmiersprachen und Projekttypen eingesetzt werden. Für spezielle Anforderungen kann man Visual Studio über sogenannte Extensions seinen Bedürfnissen anpassen. Dieses flexible Konzept macht es möglich, den Einsatzzweck nahezu beliebig zu erweitern und die IDE auch für völlig neue Projekttypen zu verwenden. In diesem Artikel betrachten wir Visual Studio in dieser Richtung genauer. Beginnen wir damit, uns einen Überblick über die Anpassungs- und Erweiterungsmöglichkeiten zu verschaffen, um die Arbeit unseres Werkzeuges besser verstehen zu können. Vielleicht dient es auch als Anregung für den einen oder anderen, eine eigene Extension für Visual Studio zu konzipieren und zu programmieren. Bevor wir jedoch damit einsteigen, müssen wir uns die Arbeit mit Workloads, Komponenten und Extensions in Visual Studio etwas genauer ansehen.

Workloads

Über den Installationsmanager können wir bestimmen, in welchen Umfang Visual Studio auf der lokalen Workstation eingerichtet werden soll. Dazu rufen Sie den Visual Studio Installer über das Startmenü (Abb. 1) auf.

Abb. 1: Auswahl von Workloads in Visual Studio

NEWSLETTER

Alle News zu Web Design, UX und Digital Marketing

Hier kann der Installationsumfang über sogenannte Workloads angepasst werden. Wir können jederzeit die Installation von Workloads oder Komponenten nachholen. Wenn Sie Visual Studio geöffnet haben, navigieren Sie zum Menüpunkt Extras | Tools und Features abrufen… Dadurch wird der Visual Studio Installer ebenfalls geöffnet. Zur Auswahl stehen die folgenden Entwicklungs-Workloads:

  • ASP.NET und Webentwicklung:Dieses Workload dient nicht nur zum Erstellen von Webanwendungen mit der üblichen Windows-Technologie, sondern auch mit HTML und JavaScript; wollen Sie Webapplikationen (auch mit anderen Frameworks) in Visual Studio erstellen, dann benötigen Sie i. d. R. diesen Workload

  • Python-Entwicklung:Applikationen mit der Programmiersprache Python bauen

  • Azure-Entwicklung:Cloud-Apps unter Nutzung der Services von Azure erstellen

  • Node.js-Entwicklung:Gestalten von Netzwerkanwendungen mit Hilfe von Node.js

  • .NET-Desktopentwicklung:Dieser Work-load wird benötigt, wenn Sie Desktopapplikationen mit Windows Forms bzw. Windows Presentation Foundation (WPF) erstellen möchten; künftig werden Desktopapplikationen auch vermehrt auf .NET Core beruhen

  • Entwicklung für die Universal Windows Platform:Applikationen für die UWP bauen; Hinweis: Möchten Sie die aktuelle Preview von WinUI 3.0 nutzen, benötigen Sie auch diesen Workload

  • Desktopentwicklung mit C++:Desktopapplikationen mit dem Microsoft Visual C++ Compiler (MSVC) erstellen; das User Interface wird mittels Microsoft Foundation Classes (MFC) programmiert

  • Mobile Entwicklung:Mobile-Apps für Android und iOS programmieren

  • Mobile Entwicklung mit C++:Komponenten für plattformübergreifende Entwicklung mit Hilfe von C++

  • Spieleentwicklung mit Unity:Komponenten für Spieleentwicklung in C# und der Game Engine Unity

  • Spieleentwicklung mit C++:Spiele mit C++ und DirectX, Unreal usw. programmieren

  • Datenspeicherung und -verarbeitung:Entwicklung von Lösungen mit SQL-Server, Azure Data Lake usw.

  • Visual-Studio-Extensionsentwicklung:Voraussetzung für die Programmierung von Extensions für Visual Studio

  • Linux-Entwicklung mit C++:Entwicklung von C++-Linux-Applikationen (Linux Subsystem unter Windows)

  • Data Science und analytische Anwendungen:Anwendungen zur Datenauswertung und künstlichen Intelligenz mit Python und F#

  • Office-/SharePoint-Entwicklung:Komponenten für die Entwicklung von Office- und SharePoint-Add-Ins

  • Plattformübergreifende .NET-Core-Entwicklung:Dieser Workload setzt auf .NET Core und damit auf plattformübergreifende Applikationen; mit dem Übergang von .NET zu .NET Core (.NET 5.0 und künftige Versionen) werden wir in der Zukunft verstärkt diese Komponenten benötigen

Die Workloads sind sinnvolle und häufig benutzte Zusammenstellungen von einzelnen Komponenten. Über die Registerkarte Einzelne Komponenten kann man die Komponenten an- oder abwählen. Vermisst man ein Feature in Visual Studio wird man ggf. hier fündig. Ein Beispiel: Der Autor visualisiert die statische Struktur eines Programms gern mit Hilfe eines Klassendiagramms. Der Klassendesigner ist nicht Bestandteil der o. g. Work-loads. Klicken Sie auf die Registerkarte Einzelne Komponentenund installieren Sie den Klassendesigner entsprechend nach (Abb. 2).

Abb. 2: Weitere Komponenten können in Visual Studio installiert werden

Häufiger müssen Sie über dieses Dialogfeld die passende Version für das .NET Framework bzw. für .NET Core installieren. Ist auf den Zielsystemen ggf. eine niedrigere .NET-Framework- bzw. .NET-Core-Version installiert, können Sie die notwendigen Systemdateien und Software Development Kits (SDK) hier auswählen und zusätzlich installieren. Diese stehen dann beim Erstellen eines neuen Projekts bzw. in den Projektoptionen entsprechend zur Verfügung. Über die Registerkarte Sprachpakete können Sie die IDE Visual Studio sprachlich in Bezug auf die Oberfläche anpassen. Die Informationen zu den Speicherorten erhalten Sie über die Registerkarte Installationspfade.

Visual Studio Extensions

Extensions (Erweiterungen) sind Add-ons für Visual Studio, mit denen man die IDE seinen Bedürfnissen anpassen kann. Es können neue Features hinzugefügt oder vorhandene Tools integriert werden. Dabei kann eine Erweiterung einen unterschiedlichen Komplexitätsgrad aufweisen, beispielsweise ein kleines Tool, um bestimmte Funktionen in Visual Studio zu automatisieren und damit die Arbeit des Entwicklers zu beschleunigen, oder man fügt einen vollständig neuen Editor hinzu, um beispielsweise andere Dateitypen zu bearbeiten. Auch grafische Editoren, zum Beispiel ein neuer Designer für die Modellierung, können über eine Extensions bereitgestellt werden. Nach Microsoft besteht das Ziel von Extensions darin, die Produktivität der Entwickler zu steigern und besser auf den individuellen Workflow eingehen zu können [1].

Bevor man sich mit der Entwicklung einer eigenen Erweiterung für Visual Studio beschäftigt, lohnt es sich, zu prüfen, ob es nicht bereits eine fertige Lösung gibt. Im Store für Erweiterungen (Marktplace) werden wir ggf. fündig. Ebenso bekommen wir hier Anregungen für die Möglichkeiten einer Erweiterung. Wir können nach der passenden Extension direkt aus Visual Studio suchen. Das entsprechende Dialogfeld rufen wir über Erweiterungen | Erweiterungen verwalten auf (Abb. 3).

Abb. 3: Extensions direkt in Visual Studio suchen und installieren

Im Dialogfeld bekommen wir einen Überblick über bereits installierte Extensions, mögliche Updates zu den zuvor installierten Erweiterungen und eine Onlinesuchfunktion nach neuen Extensions. Diese sind in entsprechende Kategorien und Unterkategorien eingeteilt. Zu jeder ausgewählten Erweiterung werden einige Basisinformationen direkt angezeigt bzw. wir erhalten einen Link zu weiteren Informationen im Web. Zu diesen Basisinformationen gehören: der Ersteller (Hersteller) der Erweiterung, die aktuell vorliegende Version, die Anzahl der Downloads, das Lizenzmodell (kostenpflichtig, frei) und die Einschätzung der Community. Mit diesen Informationen ist man in der Lage, den möglichen Nutzen einer Erweiterung vor der Installation in Visual Studio einzuschätzen.

Wenn wir im kommenden Abschnitt auf die Entwicklung von eigenen Extensionen eingehen, werden Sie sehen, dass sich diese tief in Visual Studio integrieren. Achten Sie daher bei der Installation einer Erweiterung und auch zu einem späteren Zeitpunkt darauf, ob es eine neue Version einer Extension gibt (Registerkarte Updates). Gelegentlich ist und war eine Extension schon die Ursache für ein massives Performanceproblem von Visual Studio. Auch die eine oder andere Absturzursache war auf eine fehlerhaft arbeitende Extension zurückzuführen. Visual Studio überwacht beim Start die Initialisierung und Performance der installierten Extensions und meldet mögliche Probleme. Das ist jedoch nicht immer zutreffend und umfasst auch nicht alle möglichen Einschränkungen, die von einer Extension ausgehen können. Das kommt insbesondere dann häufiger vor, wenn Visual Studio ein größeres Update erhält und die betreffende Extension (noch) nicht an diese Änderungen angepasst wurde. Hier hilft ein Update der Extension bzw. im Zweifelsfall ihre Deinstallation.

Kommen wir noch zu einem interessanten Feature im Zusammenhang mit dem Sharing von Extensions. Zunehmend arbeiten wir an unterschiedlichen Arbeitsplätzen (Büro, Mobil, Homeoffice). Es ist wünschenswert, wenn wir eine einmal eingerichtete IDE mit möglichst wenig Aufwand auch auf einen anderen Arbeitsplatz projizieren können. In Bezug auf die Visual Studio Extensions hilft uns der sogenannte Roaming Extension Manager. Mit seiner Hilfe können wir alle von uns bevorzugten Erweiterungen in allen Installationen von Visual Studio verfolgen, indem eine synchronisierte Liste in der Cloud erstellt wird. Wenn Sie sich bei Visual Studio anmelden, können Sie diese Liste der Erweiterungen anzeigen, indem Sie im o. g. Dialogfeld auf Roaming Extension Manager klicken. Nun können wir entscheiden, ob wir auf den betreffenden Rechner die angezeigte Extension ebenfalls installieren möchten oder ob wir diese aus dem Roaming herausnehmen. Wir haben daher drei Optionen, die über Symbole dargestellt werden (Abb. 4).

Abb. 4: Visual Studio erlaubt ein Roaming der Extension über die Cloud

  • Roamed:Bezeichnet eine Erweiterung, die Teil der Roamingliste ist, jedoch (noch) nicht auf diesem Computer installiert ist. Sie können diese über die SchaltflächeDownloadinder lokalen Visual-Studio-Version installieren.

  • Roamed und installiert: Bezeichnet alle Erweiterungen, die Teil der Roamingliste sind und in der lokalen Visual-Studio-Umgebung installiert sind. Wenn Sie sich entscheiden, kein Roaming durchzuführen, können Sie diese über die SchaltflächeRoaming beendenentfernen.

  • Installation: Bezeichnet alle Erweiterungen, die in dieser Umgebung installiert sind, aber nicht Teil der Roamingliste sind. Man kann Sie über die SchaltflächeRoaming startenzur Roamingliste hinzufügen.

Die Symbole zeigen Ihnen den aktuellen Status der Liste. Bei einem Wechsel des Arbeitsplatzes können wir die IDE daher schnell um bereits eingesetzte Extensions anpassen. Richten Sie beispielsweise auf einem Rechner eine Visual-Studio-Version für die Entwicklung von Desktopapplikationen ein und auf einem anderen Computer für die Mobile-Entwicklung. So ergibt es durchaus Sinn, einige Extensions, zum Beispiel zur Codeformatierung, zwischen den Rechnern zu teilen und andere Erweiterungen, die exklusiv für die Mobile- oder Desktopentwicklung eingesetzt werden, aus dem Roaming auszunehmen.

Entschließt man sich zum Download und der Installation einer Extension, wird sie heruntergeladen und man wird zum Neustart von Visual Studio aufgefordert. Die IDE installiert die betreffende Extension über den VSIX-Installer, d. h. eine Datei des Typs *.vsix in die aktuelle Version von Visual Studio (Abb. 5). Danach steht sie in der Entwicklungsumgebung zur Verfügung.

Abb. 5: Installation einer Extension in Visual Studio

Statt der direkten Suche nach Erweiterungen in Visual Studio können Sie diese auch auf der Webseite des Marketplace von Visual Studio [2] suchen. Hier finden Sie i. d. R. alle notwendigen Informationen zur Erweiterung, meist inklusive einer Beschreibung zur Installation, zu den aktuellen Versionen, zu den unterstützten Visual-Studio-Versionen usw. (Abb. 6).

Abb. 6: Marktplatz für Visual Studio Extensions

Die Anwendung bzw. Funktionalität wird durch den Entwickler in den meisten Fällen demonstriert. Wird die Erweiterung öffentlich entwickelt, findet man den Link zum GitHub-Repository. Ebenso gibt es die Möglichkeit, dass Entwickler (jetzt in der Funktion eines Anwenders) ein Rating und eine Review der Extension abgeben. Haben wir eine eigene Extension entwickelt, dann sollten wir diese über den Marketplace zur Verfügung stellen, damit sie auch von anderen Entwicklern gefunden wird. Mit diesen Hintergrundwissen können wir uns den Entwicklungszyklus für eine eigene Extension ansehen.

NOCH MEHR ZU WEB DESIGN?

Der Web Design & Development Track

Visual Studio Extensions entwickeln

Die Arbeit beginnt – wie so oft – damit, die Entwicklungsumgebung fit zu machen, damit wir den gewünschten Projekttyp von Software entwickeln können. Installieren Sie dazu den Workload Visual Studio SDK. Die benötigten Komponenten werden heruntergeladen und Visual Studio wird angepasst. Während das im Hintergrund passiert, können wir uns schon einige Gedanken machen, welche Art von Extension wir für die IDE erstellen könnten. Microsoft nennt dazu die folgenden Bereiche [3]:

  • Unterstützung für weitere Programmiersprachen mit Syntaxhervorhebung im Quellcodeeditor, IntelliSense und Compiler- und Debuggerunterstützung

  • Produktivitätstools zur Erweiterung der IDE mit zusätzlichen Vorlagen, neuen Dialogfeldern oder Toolfenstern

  • Domänenspezifische Designer für den Entwurf von Datensammlungen usw.

Die Palette der möglichen Eingriffe in Visual Studio ist kaum beschränkt. Wir können u. a. Menüs, Symbolleisten, Befehle, Fenster, Projektmappen, Projekte, Editoren usw. erweitern bzw. anpassen. Mit der Installation des Visual Studio SDK wandern einige neue Projektvorlagen auf den Rechner. Diese lassen sich in zwei Bereiche einteilen:

  • VSPackages: Diese Vorlage wird für Extensions verwendet, die Befehle, Toolfenster und Projekte erweitern

  • MEF-Erweiterungen: dienen der Erweiterung oder Anpassung des Visual-Studio-Editors

Extensions können mit C#, VB .NET oder C++ programmiert werden. Beginnen wir mit einem einfachen Beispiel, um die Vorgehensweise zu demonstrieren. Starten Sie Visual Studio. Sie haben nun eine Reihe von neuen Projektvorlagen (Abb. 7).

Abb. 7: Neue Projektvorlagen für Extensions in Visual Studio

 

Extensions für Visual Studio für Mac und Visual Studio Code

Die in diesem Artikel aufgeführten Informationen beziehen sich auf Visual Studio. Sie können auch Extensions für Visual Studio für Mac erstellen. Einige Extensions werden für beide Entwicklungsumgebungen angeboten. Das ergibt nur für Projektarten Sinn, die es auf beiden Plattformen gibt, beispielsweise Mobile-Entwicklung mit Xamarin. Ein erstes Beispiel, wie Sie die IDE Visual Studio für Mac erweitern, finden Sie unter [4]. Der Ablauf gestaltet sich im Wesentlichen, wie folgt:

  • Installation des Erweiterungspakets Add-In-Maker

  • Verwenden der neuen Vorlage Xamarin Studio Addin

  • Programmierung des Add-in mit der Programmiersprache C#

Beim Neustart des Projekts startet Visual Studio für Mac eine neue Instanz der IDE, in der das Add-in ausgeführt wird.

Auch Visual Studio Code kann über Extensions umfassend erweitert werden. Die Flexibilität des Editors lebt davon, dass man diesen an nahezu jede Programmiersprache und Projektvorlage anpassen kann. Er bietet ein umfangreiches Extension API, das die Basis für das Erstellen von Erweiterungspaketen ist. Einen Einstieg in das Thema findet man unter [5].

Aus den angebotenen Optionen wählen wir die Projektvorlage Visual C#-VSIX-Projekt. Lassen Sie Visual Studio den Projektrumpf mit der zugehörigen Projektstruktur erstellen. Wählen Sie die Manifest-Datei *.vsixmanifest aus. Hier können Sie die grundlegenden Einstellungen zur Extension festlegen wie Autor, Beschreibung und Version (Abb. 8).

Abb. 8: Eigenschaften einer Extension – Konfiguration über die Manifest-Datei

Abb. 9: Hinzufügen von Elementen zu einem Extensions-Projekt

NEWSLETTER

Alle News zu Web Design, UX und Digital Marketing

Belassen wir es zunächst bei den Standardeinstellungen. Fügen Sie über das Kontextmenü des Projekts im Projektmappen-Explorer ein neues Element hinzu. Dazu bekommen wir eine große Auswahl an möglichen Elementen, die wir der Extension hinzufügen können (Abb. 9), zum Beispiel:

  • Command: ein neuer Menübefehl, der in der Menüleiste von Visual Studio hinzugefügt wird

  • Windows Forms / WPF Toolbox Control: eigene Dialogfelder (Toolbox) in Windows Forms bzw. WPF

  • Diverse Erweiterungen für den Editor: zum Beispiel für zusätzliche Randnotizen (Editor Text Adornment), zum Einfärben von Text (Editor Classifier) usw.

In diesem einführenden Beispiel wählen wir Command. Es wird u.a. eine Quellcodedatei (*.cs) für das neue Command zum Projekt hinzugefügt. In dieser Datei wird festlegt, welche Aktionen bei Klick auf den neuen Menübefehl ausgeführt werden, beispielsweise kann hier ein neues Tool-Window geöffnet werden. Über die *.vsct-Datei können wir die Einbindung, Bezeichnung usw. des Menübefehls konfigurieren. Die Datei ist sehr umfangreich, aber glücklicherweise mit einer Reihe von Kommentaren ausgestattet. Suchen Sie den Abschnitt, der in Abbildung 10 dargestellt ist und passen Sie bei Bedarf die Zeichenketten für die Bezeichnung des hinzugefügten Commands (Befehl) an.

Abb. 10: Anpassen der Commands für die Extension in der *.vsct-Datei

Wechseln wir in die Quelltextdatei (C#, *.cs) für den Command. Hier ist die Methode private void Execute(…) entscheidend (Listing 1).

private void Execute(object sender, EventArgs e)
  {
    ThreadHelper.ThrowIfNotOnUIThread();
    string message = string.Format(…);
    string title = "MyCommand";
 
    // Show a message box to prove we were here
    VsShellUtilities.ShowMessageBox(
      this.package,
      message,
      title,
      OLEMSGICON.OLEMSGICON_INFO,
      OLEMSGBUTTON.OLEMSGBUTTON_OK,
      OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
  }

Es wird beispielhaft eine Textnachricht in Form einer MesssageBox auf den Bildschirm geworfen. Diesen Quellcodeabschnitt müssen wir dann individuell für die geplante Funktion der Extension anpassen. Wie testet man eigentlich diese Extensions? Es handelt sich in diesem Fall nicht um eine „normale“ Anwendung. Starten Sie die Extension zur Ausführung mit der Taste F5 (Debugging). Visual Studio kompiliert die Extension und startet eine neue zusätzliche(!) Instanz von Visual Studio. In dieser Instanz wird nun die Extension integriert und kann aufgerufen werden. Der neue Befehl wird dem Menü Extras hinzugefügt. Bei Klick auf dieses Menüelement erscheint das konfigurierte Meldungsfenster mit der Nachricht. Damit haben wir unsere erste Extension für Visual Studio in Form eines „Hello-World“-Programms erstellt. Der Erfolg einer solchen Extension hängt von der Idee ab oder mit anderen Worten: „Welche Funktion fehlt Ihrer Meinung nach noch in Visual Studio?“ Dann ist es jetzt an der Zeit, diese nachzurüsten.

Extensions für die Welt

Vielleicht werden Sie die eine oder andere Extension lediglich als Arbeitserleichterung für sich selbst schreiben. Das ist auch in Ordnung so. Es gibt mehrere Möglichkeiten, eine Extension für andere Entwickler zur Verfügung zu stellen. Wir wollen diese hier skizzieren.

Mit dem Kompilieren des Projektes entsteht eine *.vsix-Datei. Diese finden Sie im Projektordner unter dem /bin-Verzeichnis im Debug– bzw. Release-Ordner. Eine solche *.vsix-Datei kann man als Erweiterung in Visual Studio installieren, in dem man diese bei geschlossenem Visual Studio ausführt. Diese *.vsix-Datei können Sie an andere Entwickler weitergeben. Das ist der einfachste, aber nicht der effektivste Weg der Distribution einer Extension. Um Extensions nur innerhalb einer Organisation einzusetzen, bietet sich die Einrichtung eines privaten Katalogs an [6], den Sie zum Beispiel im Intranet Ihrer Organisation hosten. Die gängige Vorgehensweise ist es jedoch, eine neue Extension über den Visual Studio Marketplace zu publizieren. Haben Sie eine fertige und getestete Extension für Visual Studio erstellt, dann können Sie diese in wenigen Schritten im Marketplace hochladen. Sie müssen sich dazu auf der Webseite des Visual Studio Marketplace [2] anmelden und die Option Publish Extension (rechts oben) auswählen. Sie müssen folgende Angaben machen: interner Name, angezeigter Name, Versionsnummer, ID, Logo, Beschreibung, Screenshoots, unterstützte Visual-Studio-Versionen, Typ, Kategorie, Preis, Quellcoderepository und die Option, ob man eine Feedbackseite zulassen möchte. Nach dem Hochladen der *.vsix-Datei erscheint die neue Erweiterung im Katalog von Visual Studio Marketplace und kann von allen Entwicklern gefunden, installiert und hoffentlich für nützlich befunden werden.

Fazit und Ausblick

Um es mal mit nicht ganz so ernsten Worten auszudrücken: „Mit Visual Studio Extensions lösen wir Probleme, die wir ohne Visual Studio nicht hätten.“

Etwas seriöser können wir durchaus sagen, dass durch Extensions die Möglichkeit besteht, die Entwicklungsumgebung umfassend mit kleinen und durchaus auch großen Erweiterungen anzupassen. Gleichgültig, ob Sie selbst (demnächst) vorhaben, eine eigene Erweiterung zu schreiben und zu veröffentlichen, oder ob Sie nur auf der Suche nach einer sinnvollen Ergänzung für Ihren individuellen Werkzeugkasten sind: Das Wissen um die grundsätzliche Funktionsweise von Extensions bringt Sie bei Ihrer alltäglichen Arbeit mit Visual Studio weiter. Der Marketplace für die Extensions ist durchaus eine Quelle für Inspirationen, um ihn in einer produktiven Pause zu durchstöbern und herauszufinden, ob nicht ein fleißiger Entwickler vor Ihnen ein ähnliches Problem hatte und es bereits zufriedenstellend gelöst hat. Stöbern Sie mal im Marktplace!

Weitere Informationen zu diesen und anderen Themen der IT finden Sie unter http://larinet.com.


Links & Literatur

[1] https://visualstudio.microsoft.com/de/vs/features/extend/

[2] https://marketplace.visualstudio.com

[3] https://docs.microsoft.com/de-de/visualstudio/extensibility/starting-to-develop-visual-studio-extensions?view=vs-2019

[4] https://docs.microsoft.com/de-de/visualstudio/mac/extending-visual-studio-mac-walkthrough?view=vsmac-2017

[5] https://code.visualstudio.com/api

[6] https://docs.microsoft.com/de-de/visualstudio/extensibility/private-galleries?view=vs-2019

Top Articles About Web Design & Development

MEHR INFOS ZUR WEBINALE?

JETZT NEWSLETTER ABONNIEREN

Programm-Updates der Webinale